import rclpy #导入ros的客户端库，必备步骤
from rclpy.node import Node #rclpy.node是ros客户端库自带的Node类，用于创建节点
import random #python自带的随机数库
from std_msgs.msg import UInt32,String,Bool
from interfaces.srv import DiceGameService #导入自定义的服务接口，interfaces是package的名称
                                           # .srv是指srv文件夹下

class GodServiceNodeWithParam(Node):  #采用面向对象(OOP)的方式建立node； 定义了一个GodServiceNode的类，继承rclpy.node中的Node；
    def __init__(self,name):  #定义初始化方法；或者叫构造函数。。(构造函数是个人的理解，源自C++)
        super().__init__(name) #调用父类初始化，需要传入参数name，通常name是实例化的Node的名称，即节点名字；比如本例子中节点名字是 God
        self.get_logger().info("GodServiceNodeWithParam初始化成功！")  #get_logger().info是rclpy.node中的方法；
        #self.i=random.randint(1,6) #产生一个随机数，表示骰子点数
        
        self.create_service(DiceGameService,"diceGameServiceWithParam",self.diceGame_callback)
        self.declare_parameter("diceNum",0)
        
        # create_service是创建服务的命令
        # 第一个参数是接口类型，我们这里使用自定义服务类型，取名为diceGame
        # 第二个参数是服务的名字,需要与客户端使用名称相同
        # 第三个参数是服务回调函数
        # 第四个参数是消息队列长度

    def diceGame_callback(self,request,response): #掷骰子服务回调函数
        #request 客户端请求对象，携带着来自客户端的数据。这这里我们收到的应该是一个uint32的数据
        #response 服务端响应，返回服务端的处理结果；我们暂时不返回数据；
        #返回值：response
        if request.input_num == self.get_parameter("diceNum").get_parameter_value().integer_value:  #判断从player收到的数字是不是骰子的点数
            response.guess_result= True   #如果猜正确，输出结果
        else:
            response.guess_result= False  #如果猜错误，输出结果
        return response
        
def main(args=None):  #main函数，程序执行的主入口
    rclpy.init(args=args)  # 初始化客户端库，必备步骤
    node=GodServiceNodeWithParam("diceGameServiceGodWithParam")  # 新建节点对象，必备步骤；传入God，将GodNode实例化
    rclpy.spin(node)   # spin循环节点,保持节点运行，检测是否收到退出指令（Ctrl+C），必备步骤
    rclpy.shutdown()  # 关闭客户端库，必备步骤